//
//  RefreshHeaderView.swift
//  MySwiftPullToRefresh
//
//  Created by likai on 2017/5/2.
//  Copyright © 2017年 terry. All rights reserved.
//

import UIKit

class RefreshHeaderView: RefreshBaseView {

    let height:CGFloat
    
    let action : () -> Void
    
    private var isRefreshing = false{
        didSet{
            updateRefreshState(isRefreshing)
            
        }
    }
    private var progress : CGFloat = 0{
        didSet{
            updatePregress(progress)
        }
    }
    
    public init(height: CGFloat, action: @escaping () -> Void){
        self.height = height
        self.action = action
        super.init(frame: .zero)
        updatePregress(progress)
        
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    /*
     1.定义:某一类事物的多种表现形态
     生活中, 猫 ---波斯猫,叮当猫
     狗 ---京巴,旺财
     程序中, 父类指针指向子类对象
     2.条件
     2.1子类继承父类
     2.2子类有重写父类的方法
     2.3父类指针指向子类对象
     
     表现形式: 在父类指针指向不同的对象的时候,通过父类指针调用被重写的方法,会执行该指针所指向的那个对象的方法.
     
     3.实现
     口述:我们在实现获取不同电脑运行的不同系统时,先创建一个Computer(父类) 并添加一个system方法,再创建一个PC类(继承于Computer类)和Mac类(继承于Computer类), 由于system的不同,我们可以在两个子类中各自重写一个system类,用于获取不同电脑的不同的系统.
     Computer *com = nil
     
     Computer = [[PC alloc]init];//实例化PC对象
     [PC system];
     
     Computer = [[Mac alloc]init];//实例化Mac对象
     [Mac system];
     
     4.原理
     id类型:通用对象指针类型,弱类型,编译的时候不进行具体的类型检查
     动态绑定:动态类型可以做到在程序直到执行时才确定对象的真实类型,进而确定需要调用那个对象方法
     OC不同于其他程序设计语言,他可以在运行的时候加入新的数据类型和新的程序模块,动态类型识别,动态绑定,动态加载
     
     5.优点
     5.1多态最重要的优点在于简化了编程接口,何以理解?他允许在类和类之间重用一些习惯性的命名,而不是为每一个新加的函数命名一个新的名字.. 这样,编程接口就是一些抽象行为的集合,从而和实现接口的类区分开.
     5.2多态也使得代码可以分散在不同的对象中,而不用视图在一个函数中考虑到所有的可能的对象.这样可以优化代码的扩张性和复用性.当一个新的情景出现时,无须对现有的代码进行改动,而只需要增加一个新的类和新的同名的方法.
     
     
     */
    open func updateRefreshState(_ isRefreshing: Bool){
        fatalError("SwiftPullToRefresh: subclasses need to implement the updateRefreshState(_:) method")
        
    }
    open func updatePregress(_ pregress: CGFloat){
        fatalError("SwiftPullToRefresh: subclasses need to implement the updateProgress(_:) method")
        
    }
    override func didMoveToSuperview() {
        super.didMoveToSuperview()
        frame = CGRect(x: 0, y: -height, width: UIScreen.main.bounds.size.width, height: height)
    }
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        
        if isRefreshing {
            return
        }
        //下面调用,会调用progress的didSet方法 --> updatePregress
        progress = min(1, max(0, -(scrollView.contentOffset.y + scrollView.contentInset.top) / height))
        
        
    }
    
    override func scrollViewWillEndDragging(_ scrollView: UIScrollView) {
        if isRefreshing || progress < 1 {
            return
        }
        beginRefreshing()
    }
    
    func beginRefreshing(){
//        if isRefreshing {
//            return
//        }
        guard let scrollView = scrollView, !isRefreshing else{
            return
        }
        progress = 1
        isRefreshing = true
        
        UIView.animate(withDuration: 0.3, animations: {
            
//            self.scrollView?.contentOffset.y = -self.height - (self.scrollView?.contentInset.top ?? 0)
//            self.scrollView?.contentInset.top += self.height
            scrollView.contentOffset.y = -self.height - scrollView.contentInset.top
            scrollView.contentInset.top += self.height
            
        }) { (completion) in
            
            self.action()
        }
    }
    
    func endRefreshing(){
        if !isRefreshing {
            return
        }
        
        UIView.animate(withDuration: 0.4, animations: { 
            self.scrollView?.contentInset.top -= self.height
        }) { (completion) in
            self.isRefreshing = false
            self.progress = 0
        }
    }
    

}
